package com.lanyam.travel.base.controller;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.lanyam.travel.base.service.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lanyam.travel.base.ProductComparator;
import com.lanyam.travel.base.entity.HomeProduct;
import com.lanyam.travel.base.entity.Product;
import com.lanyam.travel.base.entity.ScenicHotel;
import com.lanyam.travel.base.entity.TravelLine;
import com.lanyam.travel.base.utils.Constant;
import com.lanyam.travel.base.utils.FileUtil;
import com.lanyam.travel.base.utils.JSONResult;

@RestController
@RequestMapping("home")
public class HomeController {

	@Autowired
	private IScenicHotelService scenicHotelService;

	@Autowired
	private ITravelLineService travelLineService;

	@Autowired
	private HomeProductService homeProductService;

	@Autowired
	private ILineGoodsService lineGoodsService;

	/**
	 * 	获取所有产品，包括线路，景点，酒店，用于轮播图选择
	 * @return
	 */
	@GetMapping("/getAllProduct")
	@ResponseBody
	public JSONResult getAllProduct()
	{
		List<ScenicHotel> scenicHotelList =  scenicHotelService.getAllScenicHotel();

		List<TravelLine> travelLineList = travelLineService.getAllTravelLine();

		List<Product> allProductList = new ArrayList<Product>();
		allProductList.addAll(scenicHotelList);
		allProductList.addAll(travelLineList);

		return JSONResult.ok(allProductList);
	}
	/**
	 * 获取所有景点/酒店/线路
	 * @param type 0：景点，1：酒店，2：线路
	 * @return
	 */
	@GetMapping("/getProductsByType")
	public JSONResult getProductsByType(int type)
	{
		List products;
		if(type == 0)
		{
			products = scenicHotelService.getAllScenic();
		}
		else if(type == 1)
		{
			products = scenicHotelService.getAllHotels();
		}
		else
		{
			products = travelLineService.getAllTravelLine();
		}
		return JSONResult.ok(products);
	}

	/**
	 * 	添加轮播图中展示的商品
	 * @param productId
	 * @return
	 */
	@PostMapping("/addHomeProduct")
	public JSONResult addHomeProduct(@RequestBody HomeProduct homeProduct)
	{
		String id = UUID.randomUUID().toString().replace("-", "");
		homeProduct.setId(id);
		homeProduct.setCreateTime(new Date());
		homeProduct.setUpdateTime(new Date());
		homeProductService.addHomeProduct(homeProduct);
		return JSONResult.ok(id);
	}
	
	/**
	 * 上传图片到banner上
	 * @param lineId
	 * @param file
	 * @return
	 */
	@RequestMapping("/attachFileToBanner")
	public JSONResult attachFileToBanner(String bannerId,@RequestParam(value = "file", required = false) MultipartFile file)
	{
		if(StringUtils.isEmpty(bannerId) || null == file)
		{
			return JSONResult.errorMsg("参数不能为空。");
		}
		HomeProduct homeProduct = homeProductService.getHomeProductById(bannerId);
		String dbPathUri = "/img/banner/"+bannerId;
		//如果是更新图片，需要先删除原来存放的图片
		String baseUri = Constant.FILE_UPLOAD_BASE_URI;
		FileUtil.delAllFile(baseUri+dbPathUri);
		String imgUri = FileUtil.uploadFile(file, dbPathUri); 
		homeProduct.setImg(imgUri);
		homeProductService.updateHomeProduct(homeProduct);
		return JSONResult.ok(homeProduct);
	}
	/**
	 * 根据id获取banner信息
	 * @param id
	 * @return
	 */
	@PostMapping("/getHomeProductById")
	public JSONResult getHomeProductById(String id)
	{
		if(StringUtils.isEmpty(id))
		{
			return JSONResult.errorMsg("参数不全");
		}
		HomeProduct homeProduct = homeProductService.getHomeProductById(id);
		return JSONResult.ok(homeProduct);
	}

	/**
	 * 	删除哪一个轮播图
	 * @param id 轮播图上对应的id
	 * @return
	 */
	@PostMapping("/deleteHomeProduct")
	@ResponseBody
	public JSONResult deleteHomeProduct(String id)
	{
		if(StringUtils.isEmpty(id))
		{
			return JSONResult.errorMsg("需要删除的轮播图中的产品不能为空。");
		}
		String dbPathUri = "/img/banner/"+id;
		//如果是更新图片，需要先删除原来存放的图片
		String baseUri = Constant.FILE_UPLOAD_BASE_URI;
		FileUtil.delFolder(baseUri+dbPathUri);
		
		homeProductService.deleteById(id);
		return JSONResult.ok();
	}
	/**
	 *	 更新轮播图中的产品，设置显示或不显示
	 * @param homeProduct
	 * @return
	 */
	@PostMapping("/updateHomeProduct")
	@ResponseBody
	public JSONResult updateHomeProduct(@RequestBody HomeProduct homeProduct)
	{
		homeProduct.setUpdateTime(new Date());
		homeProductService.updateHomeProduct(homeProduct);
		return JSONResult.ok();
	}
	/**
	 * 更新轮播图是否显示
	 * @param id
	 * @param status 0为不显示，1为显示
	 * @return
	 */
	@PostMapping("/updateHomeProductType")
	public JSONResult updateHomeProductType(String id,int status)
	{
		if(StringUtils.isEmpty(id))
		{
			return JSONResult.errorMsg("参数不全");
		}
		homeProductService.updateHomeProductType(id,status);
		return JSONResult.ok();
	}
	/**
	 * 获取所有轮播图
	 * @return
	 */
	@GetMapping("/getAllHomeProduct")
	public JSONResult getAllHomeProduct()
	{
		List<HomeProduct> allHomeProduct = homeProductService.getAllHomeProduct();
		return JSONResult.ok(allHomeProduct);
	}
	/**
	 * 	获取展示的轮播图
	 * @return
	 */
	@GetMapping("/getHomeShowProduct")
	@ResponseBody
	public JSONResult getHomeShowProduct()
	{
		List<HomeProduct> showHomeProductList = homeProductService.queryHomeProductOnShow();
		return JSONResult.ok(showHomeProductList);
	}
	/**
	 *	 根据条件查出线路列表并分页返回
	 * @param reqMap 请求参数：
	 * region:区分国内游/国际游，值=0代表国内，1代表国外
	 * price:价格排序，值=0代表升序排列（默认），1代表降序排列
	 * distance:距离排序，值=0代表升序排列（默认），1代表降序排列
	 * location:地区搜索
	 * 	star:星级搜索
	 * 	commentScore:评分排序，值=0代表升序排列，1代表降序排列（默认）
	 * @return
	 */
	@PostMapping("/getTravelLineList")
	@ResponseBody
	public JSONResult getTravelLineList(@RequestBody(required = false) Map<String,Object> reqMap)
	{
		Map<String,Object> map = (Map<String, Object>) reqMap.get("reqMap");
		Page<TravelLine> pages = travelLineService.queryTravelLineList(Integer.parseInt(map.get("page").toString()), Integer.parseInt(map.get("pageSize").toString()), map);
		return JSONResult.ok(pages);
	}

	/**
	 * @param lineId
	 * @return
	 */
	@PostMapping("/getTravelProductList")
	@ResponseBody
	public JSONResult getTravelProductList(String lineId){
		List<ScenicHotel> list = lineGoodsService.queryGoodsOnLine(lineId);
		return JSONResult.ok(list);
	}
	/**
	 *	 根据条件查出景点列表并分页返回
	 * @param reqMap 请求参数：
	 * price:价格排序，值=0代表升序排列（默认），1代表降序排列
	 * region:类型，分国内，国外，值=0代表国内，1代表国外，-1不区分国内外（默认）
	 * distance:距离排序，值=0代表升序排列（默认），1代表降序排列
	 * location:地区搜索
	 * 	star:星级搜索
	 * 	commentScore:评分排序， 值=0代表升序排列，1代表降序排列（默认）
	 * @return
	 */
	@PostMapping("/getScenicList")
	@ResponseBody
	public JSONResult getScenicList(@RequestBody Map<String,Object> reqMap)
	{
		Map<String,Object> map = (Map<String, Object>) reqMap.get("reqMap");
//		map.put("product_type", 0);
		Page<ScenicHotel> pages = scenicHotelService.queryScenicListPage(Integer.parseInt(map.get("page").toString()), Integer.parseInt(map.get("pageSize").toString()),map);
		return JSONResult.ok(pages);
	}
	/**
	 *	 根据条件查出酒店列表并分页返回
	 * @param reqMap 请求参数：
	 * price:价格排序，值=0代表升序排列（默认），1代表降序排列
	 * region:类型，分国内，国外，值=0代表国内，1代表国外，-1不区分国内外（默认）
	 * distance:距离排序，值=0代表升序排列（默认），1代表降序排列
	 * location:地区搜索
	 * 	star:星级搜索
	 * 	commentScore:评分排序， 值=0代表升序排列，1代表降序排列（默认）
	 * product_type:产品类型，0为景点，1为酒店
	 * @return
	 */
	@PostMapping("/getHotelList")
	@ResponseBody
	public JSONResult getHotelList(@RequestBody Map<String,Object> reqMap)
	{
		Map<String,Object> map = (Map<String, Object>) reqMap.get("reqMap");
		Page<ScenicHotel> pages = scenicHotelService.queryScenicListPage(Integer.parseInt(map.get("page").toString()), Integer.parseInt(map.get("pageSize").toString()),map);
		return JSONResult.ok(pages);
	}
	/**
	 *	 获取首页推荐（线路，景点，酒店），根据每月的交易次数从大到小排序
	 * @param page 第几页
	 * @param pageSize 每页显示个数
	 * @return
	 */
	@PostMapping("/getRecommandList")
	@ResponseBody
	public JSONResult getRecommandList(int page,int pageSize)
	{
		//TODO 获取首页推荐（线路，景点，酒店），根据每月的交易次数从大到小排序
		List<ScenicHotel> scenicHotelList =  scenicHotelService.getAllScenicHotel();

		List<TravelLine> travelLineList = travelLineService.getAllTravelLine();

		List<Product> allProductList = new ArrayList<Product>();
		allProductList.addAll(scenicHotelList);
		allProductList.addAll(travelLineList);
		
//		Arrays.sort(array,new ProductComparator());
		Collections.sort(allProductList, new Comparator<Product>() {

			@Override
			public int compare(Product p1, Product p2) {
				// TODO Auto-generated method stub
				int count1 = null==p1.getDealCount()?0:p1.getDealCount();
				int count2 = null==p2.getDealCount()?0:p2.getDealCount();
				return count2 - count1;
			}
		});
		Product[]  array= new Product[allProductList.size()];
		array = allProductList.toArray(array);
		
		List<Product> result = new ArrayList<Product>();
		if((page-1)*pageSize < array.length)
		{
			if((page*pageSize) <= array.length)
			{
				for (int i = (page-1)*pageSize + 1; i < page*pageSize; i++) {
					result.add(array[i]);
				}
			}
			else
			{
				for (int i = (page-1)*pageSize + 1; i < array.length; i++) {
					result.add(array[i]);
				}
			}
		}
		return JSONResult.ok(result);
	}
	/**
	 *	 搜索线路，酒店，景点 按名称搜索
	 * @param key
	 * @return
	 */
	@PostMapping("/searchProduct")
	@ResponseBody
	public JSONResult searchProduct(String key)
	{
		List<HomeProduct> homeList = homeProductService.searchTitle(key);
		return JSONResult.ok(homeList);
	}

	/**
	 *
	 * @param id 产品id
	 * @param productType 产品类型 0为景点/酒店 1为线路
	 * @return
	 */
	@PostMapping("/getProductById")
	public JSONResult getProductById(String id,int productType)
	{
		if(StringUtils.isEmpty(id)||StringUtils.isEmpty(productType))
		{
			return JSONResult.errorMsg("参数不全");
		}
		Product product;
		if(productType == 0 || productType == 1 )
		{
			product = scenicHotelService.getScenicById(id);
		}
		else if(productType == 3)
		{
			product = travelLineService.getTravelLineById(id);
		}
		else
		{
			return JSONResult.errorMsg("产品类型不匹配");
		}
		return JSONResult.ok(product);
	}

	@GetMapping("/hello")
	@ResponseBody
	public JSONResult hello()
	{
		return JSONResult.ok("Hello Spring Boot~");
	}
	@RequiresRoles("admin")
    @RequiresPermissions("create")
    @GetMapping(value = "/create")
    public String create() {
        return "Create success!";
    }
}
